﻿using System;
using System.Diagnostics;
using System.IO;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;

namespace SksApp
{
    public class Terazi
    {
        SerialPort _serial = null;
        private Teraziler TeraziCinsi { get; set; }
        private string ReceiveData;

        public Terazi()
        {
            _serial = new SerialPort();
            _serial.ReadTimeout = 3000;
            _serial.WriteTimeout = 3000;
            switch (Settings.Instance.GetValue(Information.TeraziTipi))
            {
                case "CAS":
                    this.TeraziCinsi = Teraziler.Cas;
                    break;
                case "TTB15":
                    this.TeraziCinsi = Teraziler.TTB15;
                    _serial.DataReceived += new SerialDataReceivedEventHandler(_serial_DataReceived);
                    break;
                case "Terazi":
                    this.TeraziCinsi = Teraziler.Genel;
                    _serial.DataReceived += new SerialDataReceivedEventHandler(_serial_DataReceived);
                    break;
                case "Densi":
                    this.TeraziCinsi = Teraziler.Densi;
                    break;
            }
        }

        void _serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort sp = sender as SerialPort;
            if (sp.IsOpen)
            {
                ReceiveData += sp.ReadExisting();
            }
        }

        private bool HarfKontrol(string filtre)
        {
            return Convert.ToBoolean(filtre.ToCharArray().Where(x => !char.IsNumber(x) && x != ',').Count());
        }

        private string HarfTemizle(string filtre)
        {
            if (HarfKontrol(filtre))
            {
                StringBuilder sb = new StringBuilder();
                sb.Append(filtre.ToCharArray().Where(x => Char.IsNumber(x) || x == ',').ToArray());
                return sb.ToString();
            }
            else
                return filtre;
        }

        private void initSettings()
        {
            switch (this.TeraziCinsi)
            {
                case Teraziler.Densi:
                case Teraziler.TTB15:
                case Teraziler.Cas:
                    _serial.PortName = Settings.Instance.GetValue(Information.TeraziPortNo);
                    _serial.BaudRate = 9600;
                    _serial.DataBits = 8;
                    _serial.StopBits = StopBits.One;
                    _serial.Parity = Parity.None;
                    break;
                default:
                    break;
            }
        }

        private string veriAl()
        {
            string veri = "";
            try
            {
                if (_serial.IsOpen)
                    veri = _serial.ReadLine();
                else
                {
                    _serial.Open();
                    if (_serial.IsOpen)
                    {
                        if (this.TeraziCinsi == Teraziler.Cas)
                        {
                            veri = _serial.ReadLine();
                        }
                        else if (this.TeraziCinsi == Teraziler.Densi)
                        {
                            int counter = 0;
                            string tmp = "";
                            while (true)
                            {
                                tmp = _serial.ReadLine();
                                if (tmp.IndexOf("ST,GS") > -1 && tmp.IndexOf(",kg") > -1)
                                {
                                    veri = tmp.Substring(5, 8).Replace('.', ',').Trim();
                                    break;
                                }

                                if (counter == 5)
                                {
                                    System.Windows.Forms.MessageBox.Show("Terazi ile iletişim kurulamadı !");
                                    break;
                                }
                                counter++;
                            }
                        }
                        else
                        {
                            int counter = 0;
                            while (true)
                            {
                                _serial.WriteLine("$");
                                Thread.Sleep(500);
                                if (!string.IsNullOrEmpty(ReceiveData) && ReceiveData.IndexOf("\r") > -1)
                                {
                                    veri = ReceiveData;
                                    break;
                                }

                                if (counter == 5)
                                {
                                    System.Windows.Forms.MessageBox.Show("Terazi ile iletişim kurulamadı !");
                                    break;
                                }
                                counter++;
                            }
                        }
                    }

                }
                _serial.Close();
            }
            catch (Exception)
            {

            }
            return veri;
        }

        public void veriGonder()
        {
            string filePath = Settings.Instance.GetValue(Information.TeraziDosyaYolu);
            string programPath = Settings.Instance.GetValue(Information.TeraziProgrami);
            if (!File.Exists(filePath))
            {
                System.Windows.Forms.MessageBox.Show("Terazi dosyası oluşturulacak yolu ayarlardan belirtin !");
                return;
            }

            if (!File.Exists(programPath))
            {
                System.Windows.Forms.MessageBox.Show("Terazi dosyasını içeri alacak program yolunu ayarlardan belirtin !");
                return;
            }

            using (SksEntity ent = new SksEntity())
            {
                var tipler = ent.BarkodTipleri.Select(x => x.Bayrak).ToList();
                var liste = (from s in ent.Stoklar
                             join b in ent.Barkodlar on s.ID equals b.StokID
                             where tipler.Contains(b.Barkodu.Substring(0, 2)) == true
                             select new { s.ID, b.Barkodu, s.Adi, s.Fiyat1 }).ToList();

                string barcode = null;
                string stock_adi = null;
                string price = null;
                string Cprice = null;
                string plutus = null;
                string omur = null;

                using (StreamWriter sw = new StreamWriter(filePath, false))
                {
                    foreach (var item in liste)
                    {
                        barcode = Cevir.Parse<int>(item.Barkodu).ToString("0000000");
                        stock_adi = item.Adi.Mid(0, 25);
                        price = item.Fiyat1.ToString("000000.00");
                        Cprice = price.Replace(",", "");
                        plutus = Cevir.Parse<int>(barcode.Substring(barcode.Length - 4)).ToString("0000");
                        omur = "000";

                        if (stock_adi.Length < 25)
                        {
                            stock_adi += stock_adi.Space(25 - stock_adi.Length);
                        }
                        else
                        {
                            stock_adi = stock_adi.Mid(0, 25);
                        }
                        sw.WriteLine(barcode.Mid(0, 7) + stock_adi + plutus + Cprice + "0100001" + omur);
                    }
                    sw.Close();
                }
            }

            if (File.Exists(programPath))
            {
                ProcessStartInfo ps = new ProcessStartInfo(programPath);
                ps.WindowStyle = ProcessWindowStyle.Normal;
                Process.Start(ps);
            }
        }

        private enum Teraziler : byte
        {
            Cas = 0,
            TTB15 = 1,
            Genel = 2,
            Densi = 3
        }

        public decimal KgVerisi()
        {
            initSettings();
            string veri = veriAl();
            decimal miktar = 0;
            if (!string.IsNullOrEmpty(veri))
            {
                switch (this.TeraziCinsi)
                {
                    case Teraziler.Cas:
                        miktar = Cevir.Parse<decimal>(HarfTemizle(veri.Replace('.', ',')));
                        break;
                    case Teraziler.Densi:
                    case Teraziler.TTB15:
                        miktar = Cevir.Parse<decimal>(veri.Replace('.', ','));
                        break;
                }
            }
            return miktar;
        }
    }
}
